class Person:
    """python"""

    # 类的属性
    native_place = "北京"

    def __new__(cls, *args, **kwargs):
        print("__new__被调用执行了", cls)
        # 没有return，就不会调用__init__方法
        return super().__new__(Person)
        return super().__new__(cls)
        return object.__new__(cls)  # 调用父类的__new__方法，创建一个新的实例

    # 初始化方法
    def __init__(self, name, age):
        print("__init__被调用执行了")
        self.name = name
        self.age = age

    def __call__(self, *args, **kwds):
        print("__call__被调用执行了")

    # debug用的方法, 可以自定义字符串的输出格式
    def __repr__(self):
        return "Person(name={0}, age={1})".format(self.name, self.age)

    def __getitem__(self, key):
        print("__getitem__被调用执行了")
    
    def __setitem__(self, key, value):
        print("__setitem__被调用执行了")

    def __delitem__(self, key):
        print("__delitem__被调用执行了")

    # 实例方法
    def eat(self):
        print("人在吃饭")


p = Person("张三", 20)
r = p["name"] # 调用__getitem__方法，输出：__getitem__被调用执行了
p["name"] = "李四" # 调用__setitem__方法，输出：__setitem__被调用执行了
del p["name"] # 调用__delitem__方法，输出：__delitem__被调用执行了
Person("张三", 20)() # 调用__call__方法，输出：__call__被调用执行了
p() # 调用__call__方法，输出：__call__被调用执行了
print(Person.__doc__)  # 查看类的文档字符串，输出：python
print(p.__dict__)  # 查看实例的属性，输出：{'name': '张三', 'age': 20}
print(dir(p)) # 查看全部属性
print(p.__class__)  # 查看实例的类，输出：<class '__main__.Person'>
print(Person.__bases__)  # 查看类的父类，输出：(<class 'object'>,)
print(Person.__module__)  # 查看类的模块，输出：__main__
print(Person.__subclasses__())  # 查看类的子类，输出：[]
print(Person.__name__)  # 查看类的名称，输出：Person
print(p)
